;主引导程序
;-----------------------------------------------------
SECTION MBR vstart=0x7c00			;告诉编译器，起始地址是0x7c00
	mov ax,cs				;因为BIOS执行完毕后cs:ip为0x0:0x7c00,所以用cs初始化各寄存器(此时cs=0)
	mov ds,ax				;ds、es、ss、fs不能给立即数初始化，需要用ax寄存器初始化
	mov es,ax
	mov ss,ax
	mov fs,ax
	mov sp,0x7c00				;初始化堆栈指针，因为目前0x7c00以下的内存暂时可用

;清屏利用0x06号功能，上卷全部行，则可清屏
;-----------------------------------------------------
;INT 0x10	功能号:0x06		功能描述:上卷窗口
;-----------------------------------------------------
;输入:
;AH	功能号= 0x06
;AL = 上卷行数（如果为0，表示全部）
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的（X,Y）位置
;(DL,DH) = 窗口右下角的（X,Y）位置
;无返回值:

	mov ax,0x600			;上卷行数:全部	功能号:06
	mov bx,0x700			;上卷属性
	mov cx,0			;左上角:(0，0)
	mov dx,0x184f			;右下角:(80,25)
					;VGA文本模式中，一行只能容纳80字节，共25行
					;下标从0开始，所以0x18=24，0x4f=79
	int 0x10			;int 0x10

;;;;;;;;	下面这三行代码获取光标位置		;;;;;;;;
;字符的位置与显存中的地址有关，和光标无关，光标只是为了好看而加上去的
;.get_cursor获取当前光标位置，在光标位置处打印字符。
	mov ah,3			;输入:3号子功能是获取光标位置，需要存入ah寄存器
	mov bh,0			;bh寄存器存储的是待获取光标的页号
	
	int 0x10			;输出:ch=光标开始行,cl=光标结束行
					;dh=光标所在行号,dl=光标所在列号
;;;;;;;;	获取光标位置结束		;;;;;;;;

;;;;;;;;	打印字符串		;;;;;;;;
	;还是用10h中断，不过这次调用13号子功能打印字符串
	mov ax,message
	mov bp,ax				;es:bp为串首地址，es此时同cs一致，
						;开头时已经为sreg初始化
	
	;光标位置要用到dx寄存器中内容，cx中光标位置可忽略
	mov cx,11			;cx为串长度，不包括结束符0的字符个数
	mov ax,0x1301			;子功能号13时显示字符及属性，要存入ah寄存器，
					;al设置写字符串方式al=01:显示字符串，光标跟随移动
	mov bx,0x2			;bh存储要显示的页号，此处时第0页，
					;bl中式字符属性，属性黑底绿字（bl = 02h）
	int 0x10				;执行BIOS 0x10 号中断
;;;;;;;;	打字字符串结束		;;;;;;;;

	jmp $					;使用程序悬停在此
	
	message db "hello world"
	times 510-($-$$) db 0
	db 0x55,0xaa
